import Vue from "vue";
import VueRouter from "vue-router";
import routes from "@/routers/routes";
import store from "@/store";


// 应用路由插件
Vue.use(VueRouter)

//因为编程式路由导航重复导航的是时候 会报错,我们需要重写push和replace解决这个问题
//1. 保存旧的push方法
const oldPushMethod = VueRouter.prototype.push;
//2. 覆盖原来的push方法 重写push
VueRouter.prototype.push = function (
	location,
	onComplate = () => {
	},
	onAbort = () => {
	}
) {
	//内部使用的还是以前的push方法,但是我们给添加了处理异常的回调函数
	return oldPushMethod.call(this, location, onComplate, onAbort);
};

//1. 保存旧的replace方法
const oldReplaceMethod = VueRouter.prototype.replace;
//2. 覆盖原来的push方法 重写push
VueRouter.prototype.replace = function (
	location,
	onComplate = () => {
	},
	onAbort = () => {
	}
) {
	//内部使用的还是以前的push方法,但是我们给添加了处理异常的回调函数
	return oldReplaceMethod.call(this, location, onComplate, onAbort);
};

const router = new VueRouter({
	mode: 'history',  // 设置路由模式
	routes,
	scrollBehavior() {  // 路由切换时 自定义路由切换时页面滚动
		return {x: 0, y: 0}   // 回到顶部
	}
})

// 游客账号也可以去的白名单  也就是没有token都可以去的页面
const whitePath = [
	"Login",
	"Home",
	"Register",
	"Search",
	"Detail",
	"AddCartSuccess",
	// "ShopCart",
];

// 设置全局路由前置守卫(token校验看是否免密登录)
router.beforeEach(async (to, from, next) => {
	// to: 即将要进入的目标 路由对象
	// form: 当前导航正要离开的路由
	// next: 操作放行
	// 1- 获取token
	const token = store.state.user.token;
	// console.log(token)
	// 2- 判断所有动态路由跳转的时候是否携带token
	if (token) { // 如果有token
		if (to.name === 'Login') { // 如果你有token 你还去登录页 多此一举
			next('/Home');  // 强制跳转首页
		} else {
			// 判断你有token 有没有用户信息
			const userNickName = store.state.user.userInfo.nickName;
			if (userNickName) {  // 有用户信息
				next()
			} else {  // 没有用户信息
				try {
					// 重新请求
					await store.dispatch("user/getUserInfo");
					//如果用户信息请求成功则直接放行
					next();
				} catch (e) {
					// 如果请求用户信息失败（token过期等） 清空保存在vuex的所有用户信息
					await store.dispatch('user/deleteUserInfo')
					alert(e.message)
					next(`/Login??redirect=${to.name}`)
				}
			}
		}
	} else { // 如果没有token
		// 查看你想去的地方是不是白名单（也就是不需要登录就可以去的地方）
		if (whitePath.includes(to.name))
			next();
		else next(`/Login?redirect=${to.name}`);
	}
	
})

export default router